<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="o3BIO" id="o3BIO"><span data-lake-id="ua447eba5" id="ua447eba5">典型回答</span></h1>
  <p data-lake-id="u651bb9a1" id="u651bb9a1"><br></p>
  <p data-lake-id="ubd57cdf7" id="ubd57cdf7"><span data-lake-id="ua663d7a7" id="ua663d7a7">G1 是 JDK 1.9中默认的垃圾收集器，他代替了Java 8 中的默认的Parallel Scavenge GC+Parallel Old GC，并且也代替了CMS。</span></p>
  <p data-lake-id="u61346561" id="u61346561"><span data-lake-id="u76889ad2" id="u76889ad2">​</span><br></p>
  <p data-lake-id="u9e896499" id="u9e896499"><span data-lake-id="u1e811ee5" id="u1e811ee5">G1 和 CMS相比，他们都是基于三色标记法实现的，替代了原有的传统的可达性分析（三色标记也是可达性分析的一种，只不过特殊一点），可以大大的降低STW的时长。但是，他们之间还是有很大的不同的：</span></p>
  <p data-lake-id="u41984162" id="u41984162"><span data-lake-id="u47f669ec" id="u47f669ec">​</span><br></p>
  <table data-lake-id="RmRSS" id="RmRSS" margin="true" width-mode="contain" class="lake-table" style="width: 750px">
   <colgroup>
    <col width="250">
    <col width="250">
    <col width="250">
   </colgroup>
   <tbody>
    <tr data-lake-id="ub76349bf" id="ub76349bf">
     <td data-lake-id="u1ee16a70" id="u1ee16a70">
      <p data-lake-id="ue221f7af" id="ue221f7af"><strong><span data-lake-id="u76a8b794" id="u76a8b794">特性</span></strong></p></td>
     <td data-lake-id="ucfabd861" id="ucfabd861">
      <p data-lake-id="uc6ef3ff4" id="uc6ef3ff4"><strong><span data-lake-id="u326522b5" id="u326522b5">CMS</span></strong></p></td>
     <td data-lake-id="u96afc284" id="u96afc284">
      <p data-lake-id="u116835c1" id="u116835c1"><strong><span data-lake-id="ue8ed371b" id="ue8ed371b">G1</span></strong></p></td>
    </tr>
    <tr data-lake-id="u8ac946d8" id="u8ac946d8">
     <td data-lake-id="u5f47dfa8" id="u5f47dfa8">
      <p data-lake-id="u28f6161d" id="u28f6161d"><strong><span data-lake-id="ue933e151" id="ue933e151">回收位置</span></strong></p></td>
     <td data-lake-id="u1b423371" id="u1b423371">
      <p data-lake-id="u186f892a" id="u186f892a"><span data-lake-id="uab19c2aa" id="uab19c2aa">老年代</span></p></td>
     <td data-lake-id="u76e13f63" id="u76e13f63">
      <p data-lake-id="u8271eaa6" id="u8271eaa6"><span data-lake-id="ub1d76a35" id="ub1d76a35">整堆</span></p></td>
    </tr>
    <tr data-lake-id="u796669d5" id="u796669d5">
     <td data-lake-id="u404b8003" id="u404b8003">
      <p data-lake-id="ueec0879a" id="ueec0879a"><strong><span data-lake-id="ueb23f5c0" id="ueb23f5c0">GC算法</span></strong></p></td>
     <td data-lake-id="uaacd277e" id="uaacd277e">
      <p data-lake-id="u0f2a009a" id="u0f2a009a"><span data-lake-id="u00805711" id="u00805711">标记-清除算法</span></p></td>
     <td data-lake-id="uf55be9d8" id="uf55be9d8">
      <p data-lake-id="u5bc18a7a" id="u5bc18a7a"><span data-lake-id="u4728537b" id="u4728537b">标记-复制算法回收年轻代</span></p>
      <p data-lake-id="ua9e86404" id="ua9e86404"><span data-lake-id="uf17842d2" id="uf17842d2">标记-整理算法回收老年代</span></p></td>
    </tr>
    <tr data-lake-id="u24b090c3" id="u24b090c3">
     <td data-lake-id="u65fa2d21" id="u65fa2d21">
      <p data-lake-id="u425fb0f7" id="u425fb0f7"><strong><span data-lake-id="u17d5e458" id="u17d5e458">垃圾识别算法</span></strong></p></td>
     <td data-lake-id="ub9a8ce46" id="ub9a8ce46">
      <p data-lake-id="u2cfd8d38" id="u2cfd8d38"><span data-lake-id="u93e3c5a3" id="u93e3c5a3">三色标记法——增量更新解决漏标</span></p></td>
     <td data-lake-id="u67189217" id="u67189217">
      <p data-lake-id="u79ce6bf5" id="u79ce6bf5"><span data-lake-id="uff2ee329" id="uff2ee329">三色标记法——原始快照解决漏标</span></p></td>
    </tr>
    <tr data-lake-id="ub9b0afdc" id="ub9b0afdc" style="height: 37px">
     <td data-lake-id="u1225398e" id="u1225398e">
      <p data-lake-id="ufe5dc6ed" id="ufe5dc6ed"><strong><span data-lake-id="u426bfb4e" id="u426bfb4e">碎片产生</span></strong></p></td>
     <td data-lake-id="u3ad661bf" id="u3ad661bf">
      <p data-lake-id="ue410bf5e" id="ue410bf5e"><span data-lake-id="u597ecfca" id="u597ecfca">存在内存碎片</span></p></td>
     <td data-lake-id="u473b7b2a" id="u473b7b2a">
      <p data-lake-id="u3741938d" id="u3741938d"><span data-lake-id="u584afa80" id="u584afa80">可防止内存碎片产生</span></p></td>
    </tr>
    <tr data-lake-id="ue225b28d" id="ue225b28d">
     <td data-lake-id="uef45b00f" id="uef45b00f">
      <p data-lake-id="uaaa79e79" id="uaaa79e79"><strong><span data-lake-id="u4103d8ef" id="u4103d8ef">可预测性</span></strong></p></td>
     <td data-lake-id="uc9429ad5" id="uc9429ad5">
      <p data-lake-id="u4ffa87fc" id="u4ffa87fc"><span data-lake-id="u4d67adda" id="u4d67adda">无法预测</span></p></td>
     <td data-lake-id="ufcc5f779" id="ufcc5f779">
      <p data-lake-id="u856d2896" id="u856d2896"><span data-lake-id="u3e73eab7" id="u3e73eab7">G1的STW时长可预测</span></p></td>
    </tr>
    <tr data-lake-id="ubf706ff3" id="ubf706ff3">
     <td data-lake-id="ua2558c41" id="ua2558c41">
      <p data-lake-id="u10173098" id="u10173098"><strong><span data-lake-id="ubf866b78" id="ubf866b78">堆内存基本要求</span></strong></p></td>
     <td data-lake-id="ua7e439d6" id="ua7e439d6">
      <p data-lake-id="u41423388" id="u41423388"><span data-lake-id="ubbbc0bef" id="ubbbc0bef">一般要求不高</span></p></td>
     <td data-lake-id="ufc5b3fb1" id="ufc5b3fb1">
      <p data-lake-id="u8968ca80" id="u8968ca80"><span data-lake-id="u577faa37" id="u577faa37">4G以上</span></p></td>
    </tr>
    <tr data-lake-id="u36b7ae29" id="u36b7ae29">
     <td data-lake-id="u49a3f573" id="u49a3f573">
      <p data-lake-id="ub7882c71" id="ub7882c71"><strong><span data-lake-id="u23965f15" id="u23965f15">自适应调优</span></strong></p></td>
     <td data-lake-id="u599a2445" id="u599a2445">
      <p data-lake-id="ub40174c6" id="ub40174c6"><span data-lake-id="ua11e154c" id="ua11e154c">不支持</span></p></td>
     <td data-lake-id="u45376857" id="u45376857">
      <p data-lake-id="u18dc3358" id="u18dc3358"><span data-lake-id="u6b1d4b9c" id="u6b1d4b9c">支持</span></p></td>
    </tr>
    <tr data-lake-id="u38635698" id="u38635698">
     <td data-lake-id="udd0128b2" id="udd0128b2"></td>
     <td data-lake-id="ud784b270" id="ud784b270"></td>
     <td data-lake-id="u61ad7d09" id="u61ad7d09"></td>
    </tr>
   </tbody>
  </table>
  <p data-lake-id="u4e5ebccd" id="u4e5ebccd"><span data-lake-id="u64bfc7c1" id="u64bfc7c1">​</span><br></p>
  <p data-lake-id="u82bda1e5" id="u82bda1e5"><span data-lake-id="u61d496f2" id="u61d496f2">总结一下就是，G1会把Java的堆分为多个大小相等的Region（每个Region的大小为1M-32M），他在年轻代回收的时候采用标记-复制算法，而在老年代回收的时候，采用的是标记-整理算法，这两种算法都可以避免内存碎片的产生。</span></p>
  <p data-lake-id="u85b8a24b" id="u85b8a24b"><span data-lake-id="u8fc3b851" id="u8fc3b851">​</span><br></p>
  <p data-lake-id="u87494646" id="u87494646"><span data-lake-id="u7ae3eda3" id="u7ae3eda3">G1在回收的过程中，标记和清理的过程是并行的，可以充分利用多个CPU来缩短STW的时长，在复制的过程中是并发的，可以让复制线程和用户线程并发执行，不需要STW。并且G1还可以在运行时动态的做区域内存大小的调整。</span></p>
 </body>
</html>